home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Language/OS - Multiplatform Resource Library
/
LANGUAGE OS.iso
/
cpp_libs
/
hlvector.lha
/
hl_vector
/
vhjmin.cc
< prev
next >
Wrap
C/C++ Source or Header
|
1993-08-08
|
5KB
|
202 lines
// This may look like C code, but it is really -*- C++ -*-
/*
************************************************************************
*
* Verify the Hook-Jeevse minimization
*
************************************************************************
*/
#include "LinAlg.h"
#include "math_num.h"
#include <builtin.h>
#include <ostream.h>
static int iter_count;
/*
*-----------------------------------------------------------------------
* Simplified vector print
*/
static void pr_vector(Vector& v)
{
register int i;
for(i=v.q_lwb(); i<=v.q_upb(); i++)
cout << form("%9.3g ",v(i));
}
/*
*------------------------------------------------------------------------
* Rosenbroke function
*/
double f1(const Vector& v)
{
register double x1 = v(1);
register double x2 = v(2);
iter_count++;
return 100*sqr(x2 - x1*x1) + sqr(1 - x1);
}
void test1()
{
const int n = 2;
Vector b0(1,n,-1.2,1.,"END"); // Initial guess
Vector b(b0); // Min location found
Vector bm(1,n,1.0,1.0,"END"); // Exact min location
Vector h0(1,n,10.,10.,"END"); // Initial step
b=b0;
iter_count = 0;
cout << "\n\n\tRosenbroke function\n";
cout << "\n\n\tf = 100*(x2-x1^2)^2 + (1-x1)^2\n\n";
cout << "\nInitial guess b0 = "; pr_vector(b0);
cout << "\nFunction value at it f0 = " << f1(b0);
cout << "\nInitial steps h0 = "; pr_vector(h0);
cout << "\n";
cout << "\nMinimum f value found f = " << hjmin(b,h0,f1);
cout << "\n at b = "; pr_vector(b);
cout << "\nExact min location bm = "; pr_vector(bm);
cout << "\nNo. of iterations ni = " << iter_count << "\n";
}
/*
*------------------------------------------------------------------------
* Bocks function
*/
double f2(const Vector& v)
{
register double x1 = v(1);
register double x2 = v(2);
iter_count++;
return sqr( exp(-1./10) - exp(-x1/10) + exp(-10./10) - exp(-x2/10) );
}
void test2()
{
const int n = 2;
Vector b0(1,n,0.,0.,"END"); // Initial guess
Vector b(b0); // Min location found
Vector bm(1,n,10.0,1.0,"END"); // Exact min location
Vector h0(1,n,10.,10.,"END"); // Initial step
b = b0;
iter_count = 0;
cout << "\n\n\tBocks function\n";
cout << "\n\n\t"
"f = [ exp(-1/10) - exp(-x1/10) + exp(-10/10) -exp(-x2/10) ]^2\n\n";
cout << "\nInitial guess b0 = "; pr_vector(b0);
cout << "\nFunction value at it f0 = " << f2(b0);
cout << "\nInitial steps h0 = "; pr_vector(h0);
cout << "\n";
cout << "\nMinimum f value found f = " << hjmin(b,h0,f2);
cout << "\n at b = "; pr_vector(b);
cout << "\nExact min location bm = "; pr_vector(bm);
cout << "\nNo. of iterations ni = " << iter_count << "\n";
}
/*
*------------------------------------------------------------------------
* Mile & Cuntrell function
*/
double f3(const Vector& v)
{
register double x1 = v(1);
register double x2 = v(2);
register double x3 = v(3);
register double x4 = v(4);
iter_count++;
return pow( exp(x1)-x2, 4) + 100*pow(x2-x3,6) + pow(atan(x3-x4),4) +
pow(x1,8);
}
void test3()
{
const int n = 4;
Vector b0(1,n,1.,2.,2.,2.,"END"); // Initial guess
Vector b(b0); // Min location found
Vector bm(1,n,0.,1.,1.,1.,"END"); // Exact min location
Vector h0(1,n,10.,10.,10.,10.,"END"); // Initial step
b = b0;
iter_count = 0;
cout << "\n\n\tMile & Cuntrell function\n";
cout << "\n\n\t"
"f = [ exp(x1)-x2 ]^4 +100(x2-x3)^6 + atan(x3-x4)^4 + x1^8\n\n";
cout << "\nInitial guess b0 = "; pr_vector(b0);
cout << "\nFunction value at it f0 = " << f3(b0);
cout << "\nInitial steps h0 = "; pr_vector(h0);
cout << "\n";
cout << "\nMinimum f value found f = " << hjmin(b,h0,f3);
cout << "\n at b = "; pr_vector(b);
cout << "\nExact min location bm = "; pr_vector(bm);
cout << "\nNo. of iterations ni = " << iter_count << "\n";
}
/*
*------------------------------------------------------------------------
* Powell function
*/
double f4(const Vector& v)
{
register double x1 = v(1);
register double x2 = v(2);
register double x3 = v(3);
register double x4 = v(4);
iter_count++;
return sqr(x1+10*x2) + 5*sqr(x3-x4) + pow(x2-2*x3,4) + 10*pow(x1-x4,4);
}
void test4()
{
const int n = 4;
Vector b0(1,n,3.,-1.,0.,1.,"END"); // Initial guess
Vector b(b0); // Min location found
Vector bm(1,n,0.,0.,0.,0.,"END"); // Exact min location
Vector h0(1,n,10.,10.,10.,10.,"END"); // Initial step
b = b0;
iter_count = 0;
cout << "\n\n\tPowell function\n";
cout << "\n\n\t"
"f = (x1+10*x2)^2 + 5(x3-x4)^2 + (x2-2x3)^4 + 10(x1-x4)^4\n\n";
cout << "\nInitial guess b0 = "; pr_vector(b0);
cout << "\nFunction value at it f0 = " << f4(b0);
cout << "\nInitial steps h0 = "; pr_vector(h0);
cout << "\n";
cout << "\nMinimum f value found f = " << hjmin(b,h0,f4);
cout << "\n at b = "; pr_vector(b);
cout << "\nExact min location bm = "; pr_vector(bm);
cout << "\nNo. of iterations ni = " << iter_count << "\n";
}
/*
*------------------------------------------------------------------------
* Root module
*/
main()
{
cout << "\n\n\n\t\tVerify HJMIN multidimensional minimizer\n";
test1();
test2();
test3();
test4();
}